package com.cskaoyan.javase.oop2._1extends._2relation;

/**
 * 继承中两个类的关系
 * 从属关系（relation）上来说
 * 继承中的父子类具有 "is-a" 关系
 * 即子类 "is-a" 父类。
 * 子类可以近似地看成是一个父类，子类可以当作父类来使用。
 *
 * 为什么子类是一个父类呢?
 * 从以下角度解释:
 *      1.从代码的角度来说,允许父类引用指向子类对象
 *          这个对象仍然是子类对象,但是引用变成了父类引用
 *          一个子类对象用父类引用指向
 *          这个子类对象就当成了一个父类类型去使用了
 *          这就是子类可以当成父类去使用
 *          子类"is-a"父类
 *
 *      2.从数据类型的定义来说,数据类型 = 数据 + 操作
 *          定义一个类,就是定义了一个自定义数据类型
 *          数据 = 成员变量的集合
 *          操作 = 成员方法的集合
 *          子类通过继承,得到了父类的成员变量以及成员方法
 *          于是从数据类型的定义上来说,子类就"覆盖了"父类
 *          子类可以当成父类使用
 *          子类"is-a"父类
 *          功能上来说,子类比父类更加强大,当父类用完全可行.
 *
 *      3.最直观的角度:
 *          Person是父类,Teacher,Student是子类
 *          老师是人,学生也是人,很明显就存在"is-a"关系
 *          注：这种方式只能应对常见和简单的场景，实际开发很多时候没有直白的逻辑关系，就需要通过设计文档来了解相关信息。
 *
 *  思考: 反过来,父类和子类有没有关系?父类"is-a"子类?
 *      子类"is-a"父类,但是
 *          父类和子类之间没有任何关系
 *          因为子类的功能往往都比父类强大,至少不会更弱
 *          父类是没有办法直接当成子类使用的
 *
 * @since 10:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Father f = new Father();
        Son s = new Son();
        // 存在继承父子关系后,允许父类引用指向子类对象
        Father fs = new Son();

        // Son ss = new Father();
    }
}

// 父类
class Father {

}

// 子类
class Son extends Father {

}